En omfattande guide till JavaScripts Temporal API för exakta och intuitiva tidsintervallsberÀkningar, frÄn grundlÀggande skapande till avancerad aritmetik.
JavaScript Temporal Duration: BemÀstra berÀkningar av tidsintervall
JavaScripts Temporal API introducerar ett modernt och kraftfullt sÀtt att hantera datum, tider och tidsintervall. Temporal.Duration
-objektet representerar en tidslÀngd och erbjuder ett tydligt och intuitivt tillvÀgagÄngssÀtt för att utföra berÀkningar med tidsintervall. Den hÀr artikeln gÄr igenom detaljerna i Temporal.Duration
och visar hur man skapar, manipulerar och formaterar varaktigheter för olika anvÀndningsfall.
Vad Àr Temporal.Duration?
Temporal.Duration
representerar ett tidsspann, uttryckt i Är, mÄnader, dagar, timmar, minuter, sekunder och brÄkdelar av en sekund (millisekunder, mikrosekunder, nanosekunder). Till skillnad frÄn Date
-objekt som representerar en specifik tidpunkt, representerar Temporal.Duration
en tidsmÀngd. Det följer ISO 8601-formatet för varaktighet (t.ex. representerar P1Y2M10DT2H30M
1 Är, 2 mÄnader, 10 dagar, 2 timmar och 30 minuter). Temporal API Àr utformat för att vara mer intuitivt och mindre felbenÀget Àn det Àldre Date
-objektet.
Skapa Temporal.Duration-objekt
Det finns flera sÀtt att skapa Temporal.Duration
-objekt:
1. FrÄn ett vanligt objekt
Du kan skapa en varaktighet genom att skicka ett objekt med de önskade egenskaperna:
const duration = new Temporal.Duration(1, 2, 10, 2, 30, 0, 0, 0);
console.log(duration.toString()); // Utskrift: P1Y2M10DT2H30M
Detta skapar en varaktighet pÄ 1 Är, 2 mÄnader, 10 dagar, 2 timmar och 30 minuter. Notera att argumenten motsvarar följande ordning: years
, months
, weeks
, days
, hours
, minutes
, seconds
, milliseconds
, microseconds
, nanoseconds
.
2. FrÄn en ISO 8601-strÀng
Du kan ocksÄ skapa en varaktighet frÄn en ISO 8601-varaktighetsstrÀng med hjÀlp av Temporal.Duration.from()
:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.toString()); // Utskrift: P1Y2M10DT2H30M
Detta Àr sÀrskilt anvÀndbart nÀr man hanterar varaktigheter som lagras i strÀngformat eller tas emot frÄn en extern kÀlla.
3. AnvÀnda metoderna add()
och subtract()
med Temporal.Instant
, Temporal.ZonedDateTime
, etc.
NĂ€r du adderar eller subtraherar Temporal.Duration
frÄn andra Temporal-typer (som Temporal.Instant
eller Temporal.ZonedDateTime
), returneras en Temporal.Duration
som representerar skillnaden mellan de tvÄ tidpunkterna om du sedan subtraherar dem. Till exempel:
const now = Temporal.Now.zonedDateTimeISO();
const later = now.add({ hours: 5 });
const duration = later.since(now);
console.log(duration.toString()); // Utskrift: PT5H
Ă tkomst till varaktighetskomponenter
Du kan komma Ät de enskilda komponenterna i ett Temporal.Duration
-objekt med hjÀlp av dess egenskaper:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.years); // Utskrift: 1
console.log(duration.months); // Utskrift: 2
console.log(duration.days); // Utskrift: 10
console.log(duration.hours); // Utskrift: 2
console.log(duration.minutes); // Utskrift: 30
console.log(duration.seconds); // Utskrift: 0
console.log(duration.milliseconds); // Utskrift: 0
console.log(duration.microseconds); // Utskrift: 0
console.log(duration.nanoseconds); // Utskrift: 0
Utföra aritmetik med varaktigheter
Temporal.Duration
-objekt stöder addition och subtraktion med metoderna add()
och subtract()
. Dessa metoder returnerar ett nytt Temporal.Duration
-objekt som representerar resultatet av operationen.
const duration1 = Temporal.Duration.from("P1Y2M");
const duration2 = Temporal.Duration.from("P3M4D");
const addedDuration = duration1.add(duration2);
console.log(addedDuration.toString()); // Utskrift: P1Y5M4D
const subtractedDuration = duration1.subtract(duration2);
console.log(subtractedDuration.toString()); // Utskrift: P10M26D
Du kan ocksÄ kedja dessa metoder för mer komplexa berÀkningar:
const duration = Temporal.Duration.from("P1D").add({ hours: 12 }).subtract({ minutes: 30 });
console.log(duration.toString()); // Utskrift: P1DT11H30M
Metoden negated()
returnerar ett nytt Temporal.Duration
-objekt dÀr alla komponenter Àr negerade:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const negatedDuration = duration.negated();
console.log(negatedDuration.toString()); // Utskrift: -P1Y2M10DT2H30M
Metoden abs()
returnerar ett nytt Temporal.Duration
-objekt dÀr alla komponenter Àr positiva vÀrden (absolutvÀrden):
const duration = Temporal.Duration.from("-P1Y2M10DT2H30M");
const absoluteDuration = duration.abs();
console.log(absoluteDuration.toString()); // Utskrift: P1Y2M10DT2H30M
Metoden with()
lÄter dig skapa en ny Temporal.Duration
-instans dÀr vissa, eller alla, egenskaper har Àndrats till nya vÀrden. Om ett vÀrde inte anges i argumentobjektet kommer det ursprungliga vÀrdet för varaktigheten att anvÀndas. Till exempel:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const newDuration = duration.with({ years: 2, days: 5 });
console.log(newDuration.toString()); // Utskrift: P2Y2M5DT2H30M
Normalisera varaktigheter
Varaktigheter kan ibland uttryckas i en icke-normaliserad form (t.ex. P1Y12M
, vilket skulle kunna förenklas till P2Y
). Metoden normalized()
försöker förenkla en varaktighet till dess mest kompakta form. Den krÀver dock ett referensdatum för att hantera komplexiteten med varierande mÄnadslÀngder. För att normalisera korrekt behöver du en instans av Temporal.PlainDate
, Temporal.ZonedDateTime
eller Temporal.Instant
.
Till exempel, för att normalisera en varaktighet som involverar mÄnader och dagar krÀvs ett referensdatum:
const duration = Temporal.Duration.from("P1M32D");
const referenceDate = Temporal.PlainDate.from("2024-01-01");
const normalizedDuration = duration.normalized({ relativeTo: referenceDate });
console.log(normalizedDuration.toString()); // Utskrift: P2M1D
I detta exempel normaliseras varaktigheten P1M32D
relativt till 1 januari 2024, vilket resulterar i P2M1D
eftersom januari har 31 dagar.
Om du bara hanterar tidskomponenter (timmar, minuter, sekunder, etc.), kan du normalisera utan ett referensdatum:
const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //eller utelÀmna relativeTo-argumentet
console.log(normalizedDuration.toString()); // Utskrift: P1DT2H1M
JÀmföra varaktigheter
Du kan jÀmföra varaktigheter med metoden compare()
. Denna metod returnerar:
- -1 om den första varaktigheten Àr kortare Àn den andra varaktigheten.
- 0 om varaktigheterna Àr lika.
- 1 om den första varaktigheten Àr lÀngre Àn den andra varaktigheten.
const duration1 = Temporal.Duration.from("P1Y");
const duration2 = Temporal.Duration.from("P6M");
const comparisonResult = Temporal.Duration.compare(duration1, duration2);
console.log(comparisonResult); // Utskrift: 1
Praktiska exempel
1. BerÀkna tiden till en hÀndelse
Anta att du vill berÀkna den ÄterstÄende tiden till en specifik hÀndelse. AnvÀnd Temporal.Now.zonedDateTimeISO()
för att fÄ den aktuella tiden, och subtrahera hÀndelsens datum. Om hÀndelsens datum har passerat blir resultatet negativt.
const eventDate = Temporal.ZonedDateTime.from({ timeZone: 'America/Los_Angeles', year: 2024, month: 12, day: 25, hour: 9, minute: 0, second: 0 });
const now = Temporal.Now.zonedDateTimeISO('America/Los_Angeles');
const durationUntilEvent = eventDate.since(now);
console.log(durationUntilEvent.toString()); // Utskrift: t.ex. P262DT14H30M (beroende pÄ aktuellt datum och tid)
2. SpÄra varaktigheten för projektuppgifter
Inom projektledning kan du anvÀnda Temporal.Duration
för att spÄra den uppskattade eller faktiska varaktigheten för uppgifter.
const task1EstimatedDuration = Temporal.Duration.from("PT8H"); // 8 timmar
const task2EstimatedDuration = Temporal.Duration.from("PT16H"); // 16 timmar
const totalEstimatedDuration = task1EstimatedDuration.add(task2EstimatedDuration);
console.log(`Total estimated duration: ${totalEstimatedDuration.toString()}`); // Utskrift: Total estimated duration: P1DT
3. BerÀkna Älder
Ăven om exakt Ă„ldersberĂ€kning krĂ€ver att man tar hĂ€nsyn till skottĂ„r och tidszoner, kan Temporal.Duration
ge en rimlig uppskattning:
const birthDate = Temporal.PlainDate.from("1990-05-15");
const currentDate = Temporal.PlainDate.from("2024-01-20");
const ageDuration = currentDate.since(birthDate, { smallestUnit: 'years' });
console.log(`Estimated age: ${ageDuration.years} years`); // Utskrift: Estimated age: 33 years
4. Visa lÀsbara varaktigheter
Ofta behöver du visa varaktigheter i ett mĂ€nskligt lĂ€sbart format. Ăven om Temporal.Duration
inte har inbyggda formateringsfunktioner kan du skapa anpassad formateringslogik:
function formatDuration(duration) {
const parts = [];
if (duration.years) parts.push(`${duration.years} Är`);
if (duration.months) parts.push(`${duration.months} mÄnad${duration.months > 1 ? 'er' : ''}`);
if (duration.days) parts.push(`${duration.days} dag${duration.days > 1 ? 'ar' : ''}`);
if (duration.hours) parts.push(`${duration.hours} timme${duration.hours > 1 ? 'ar' : ''}`);
if (duration.minutes) parts.push(`${duration.minutes} minut${duration.minutes > 1 ? 'er' : ''}`);
if (duration.seconds) parts.push(`${duration.seconds} sekund${duration.seconds > 1 ? 'er' : ''}`);
return parts.join(', ');
}
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // Utskrift: 1 Är, 2 mÄnader, 10 dagar, 2 timmar, 30 minuter
Avancerad anvÀndning och övervÀganden
1. Hantering av tidszoner
NÀr man hanterar tidsintervall som korsar tidszonsgrÀnser eller övergÄngar till sommartid, Àr det avgörande att anvÀnda Temporal.ZonedDateTime
för att sÀkerstÀlla korrekta berÀkningar. Att anvÀnda Temporal.PlainDate
och Temporal.PlainTime
undviker alla tidszonskonverteringar.
2. Minsta enhet och avrundning
Metoderna `since()` och `until()` accepterar ofta alternativ för att definiera den minsta enheten för den resulterande varaktigheten. Till exempel för att berÀkna tiden *till* en hÀndelse och begrÀnsa resultatet till dagar.
const eventDate = Temporal.PlainDate.from("2024-12-25");
const now = Temporal.PlainDate.from("2024-01-20");
const durationUntilEvent = now.until(eventDate, { smallestUnit: 'days' });
console.log(durationUntilEvent.toString()); //exempelutskrift PT340D
3. Skottsekunder
Temporal tar inte hÀnsyn till skottsekunder automatiskt. Om du krÀver extrem precision mÄste du hantera skottsekunder separat.
4. IANA-tidszoner
Temporal API förlitar sig pÄ IANA (Internet Assigned Numbers Authority) tidszonsdatabas. Se till att din miljö har en uppdaterad version av IANA-databasen för att hantera tidszonskonverteringar korrekt.
BĂ€sta praxis
- AnvÀnd ISO 8601-format för varaktighetsstrÀngar: Detta sÀkerstÀller konsekvens och interoperabilitet.
- VÀlj lÀmplig Temporal-typ: AnvÀnd
Temporal.PlainDate
,Temporal.PlainTime
,Temporal.ZonedDateTime
ellerTemporal.Instant
beroende pÄ om du behöver tidszonsstöd eller inte. - Normalisera varaktigheter nÀr det behövs: Normalisering förenklar varaktigheter och gör dem lÀttare att jÀmföra.
- Hantera tidszoner noggrant: Tidszonskonverteringar kan vara komplexa, sÄ anvÀnd
Temporal.ZonedDateTime
och var medveten om övergÄngar till sommartid. - TÀnk pÄ den minsta enheten: NÀr du berÀknar varaktigheter, specificera den minsta enheten för att fÄ önskad precision.
- Skriv enhetstester: Testa din kod noggrant för att sÀkerstÀlla att varaktighetsberÀkningar Àr korrekta.
Vanliga fallgropar
- Ignorera tidszoner: Att inte ta hÀnsyn till tidszoner kan leda till felaktiga varaktighetsberÀkningar, sÀrskilt nÀr man hanterar hÀndelser pÄ olika platser.
- AnvÀnda det gamla Date-objektet: Det gamla
Date
-objektet Àr kÀnt för sina egenheter och inkonsekvenser. Föredra Temporal API för mer tillförlitlig hantering av datum och tid. - Att inte normalisera varaktigheter: Att inte normalisera varaktigheter kan göra jÀmförelser och berÀkningar mer komplexa.
- Felaktigt ISO 8601-format: Att anvÀnda en ogiltig ISO 8601-varaktighetsstrÀng kan orsaka fel.
Verkliga anvÀndningsfall i olika kulturer
Temporal API kan vara sÀrskilt fördelaktigt i globala applikationer dÀr tidszonsskillnader och kulturella nyanser Àr betydande. HÀr Àr nÄgra exempel:
- Global hÀndelseplanering: SchemalÀgg hÀndelser exakt över flera tidszoner, med hÀnsyn till övergÄngar till sommartid. Till exempel, att schemalÀgga ett webbinarium som börjar kl. 09:00 PST och visa motsvarande starttid i olika tidszoner som CET, JST och AEDT.
- Internationell reseplanering: BerÀkna restider, inklusive mellanlandningar och tidszonsÀndringar. Detta Àr anvÀndbart för att generera resplaner och hantera flygscheman. Till exempel, berÀkna den totala restiden frÄn New York till Tokyo, inklusive en mellanlandning i London och justering för tidszonsskillnader.
- Global e-handel: Visa berÀknade leveranstider i anvÀndarens lokala tidszon. Detta krÀver att man beaktar ursprungstidszonen, leveranstiden och destinationstidszonen. Till exempel, en vara som skickas frÄn ett lager i Tyskland till en kund i Australien, med en berÀknad leveranstid pÄ 7 dagar, visas i kundens lokala tid.
- GrÀnsöverskridande finansiella transaktioner: BerÀkna rÀnteperiodisering eller betalningsfrister korrekt över olika regioner. Detta innebÀr ofta att man mÄste ta hÀnsyn till olika arbetsdagar och helgdagar i varje land. Till exempel, berÀkna rÀntan pÄ ett lÄn i Singapore, med hÀnsyn till singaporianska helgdagar.
- Multikulturella kalenderapplikationer: Stödja olika kalendersystem, sÄsom den islamiska eller hebreiska kalendern, och korrekt berÀkna varaktigheter och pÄminnelser för hÀndelser baserat pÄ dessa kalendrar.
- Global projektledning: SpÄra varaktigheter och deadlines för projektuppgifter i distribuerade team, med hÀnsyn till olika arbetsscheman och tidszoner.
Slutsats
Temporal.Duration
erbjuder ett robust och intuitivt sÀtt att arbeta med tidsintervall i JavaScript. Genom att förstÄ dess funktioner och bÀsta praxis kan du med sÀkerhet utföra exakta och tillförlitliga varaktighetsberÀkningar i dina applikationer. Att anamma Temporal API leder till renare, mer underhÄllbar kod och minskar risken för fel som Àr förknippade med Àldre hantering av datum och tid.
NÀr du fördjupar dig i Temporal API, kom ihÄg att konsultera den officiella dokumentationen och experimentera med olika scenarier för att fullt ut förstÄ dess kapacitet. Med sin moderna design och omfattande funktioner Àr Temporal redo att revolutionera hur vi hanterar datum, tider och varaktigheter i JavaScript.